package com.copa.l56;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author copa
 * @createDate 2022-05-12 21:39
 * @function 排序法 说实话一开始我是想用暴力法...但是想到如下两个问题
 * Q1：如果给出的intervals是不按大小的该怎么处理
 * Q2：当我把某个数组加入到result后，仍需要一个一个遍历是否合并？
 * 大概想了半个钟...我就无从下手了...后来看了有排序法这样的才知道是怎么回事...
 */
public class Test1 {

    public int[][] merge(int[][] intervals) {
        // 定义结果，方便操作...说实话以下的语法是我没见到过的语法...还是我学Java太菜了...o(╥﹏╥)o
        ArrayList<int[]> result = new ArrayList<>();
        if (intervals.length < 2) {
            return intervals;
        }
        // 这里排序是根据intervals元素从小到大排序
        // 这里就是核心突破点了...我就一直徘徊那两个问题应该怎么解决...后来看到这里就知道怎么回事了...看来得多学学这些语法了...
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        for (int[] interval : intervals) {
            if (result.size() == 0 || interval[0] > result.get(result.size() - 1)[1]) {
                // 这里如果result没有或者是遍历里的最小值都比我这个result里的最大值还大，那不得添加结果集嘛
                result.add(interval);
            } else {
                // 假若不是上述情况，那就是合并区间了，这个要result最大值和遍历中的最大值进行比较取最大就好啦
                result.get(result.size() - 1)[1] = Math.max(result.get(result.size() - 1)[1], interval[1]);
            }
        }
        // 这个语法也是我万万没想到的...目前的我看到数组只会用数组进行处理...至于集合和数组间的转化怎么处理一概不知...
        return result.toArray(new int[result.size()][2]);
    }

    public static void main(String[] args) {
        int[][] intervals = new int[][]{{1,3},{8,10},{2,6},{15,18}};
        int[][] merge = new Test1().merge(intervals);
        for (int[] interval : merge) {
            System.out.print(Arrays.toString(interval) + "\t");
        }
    }
}
